package com.zrk.oop;

import java.util.Arrays;

public class FunctionLearn {
    public static void main(String[] args) {
        Person wangMing = new Person("王明", 23);

        // private属性的field（字段）不能被直接放翁
        System.out.println(wangMing.getName());

        // 如果不复写toString，toString将返回地址
        System.out.println(wangMing.toString());

        // 可变参数构造函数
        Group group1 = new Group("小王", "小丽", "小张");
        System.out.println(group1.toString());

    }
}


/**
 * 人类
 */
class Person {
    // 名字
    protected String name;
    // 年龄
    private int age;

    /**
     * 外部不能直接获取私有成员，但是可以使用方法获取到成员
     * @return 名字
     */
    public String getName() {
        return name;
    }

    /**
     * 外部不能直接设置私有成员的值，但是可以使用方法设置
     * 如果有局部变量和字段重名，那么局部变量优先级更高，就必须加上this
     * @param name
     */
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public int getAge() {
        return age;
    }

    /**
     * 构造函数
     * @param name 第一个参数
     * @param age 第二个参数
     */
    public Person(String name, int age) {
        this.name = name;
        this.age = age;
    }

    /**
     * 所有类都集成与object类，相当于所有类都有toString(),
     * 如果没有命名冲突，可以省略this
     * @Override 该注解可以在编译的时候检查在父类（object）中是否存在相同方法
     * @return 转换后的字符串
     */
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}

/**
 * 可以使用可变参数构造
 */
class Group {
    private String[] names;

    @Override
    public String toString() {
        return "Group{" +
                "names=" + Arrays.toString(names) +
                '}';
    }

    public Group(String... names) {
        this.names = names;
    }
}